﻿/* Copyright (C) 2008-2009 by Giuseppe Pitta (Darkman) <darkman@darkman.it>
 * 
 * EaZy Psotnic Project
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.IO;

namespace ParserRE
{
    public class ParserEventArgs : EventArgs
    {
        private Match mt;

        public ParserEventArgs(Match mt)
            : base()
        {
            this.mt = mt;
        }

        public Match MatchResult
        {
            get { return mt; }
        }
    }

    public class Parser
    {
        private Dictionary<String, EventHandler<ParserEventArgs>> patterns;
        private IDictionaryEnumerator e;
        private Match mt;
        private ErrorEventHandler errorHandler;

        public Parser(Dictionary<String, EventHandler<ParserEventArgs>> patterns, ErrorEventHandler errorHandler)
        {
            this.patterns = patterns;
            this.errorHandler = errorHandler;
            e = this.patterns.GetEnumerator();
            e.MoveNext();
        }

        public void intelliParse(string line)
        {
            for (int i = 0; i < patterns.Count; i++)    // Esegue massimo un ciclo di patterns a prescindere dalla
            {                                           // posizione iniziale
                try
                {
                    mt = Regex.Match(line, e.Key.ToString());
                    if (mt.Success)
                    {
                        ((EventHandler<ParserEventArgs>)e.Value)(this, new ParserEventArgs(mt));
                        return;                             // Mantiene la posizione dell'iteratore per il prossimo
                    }                                       // matching (utile nei listati)
                }
                catch (Exception ex)
                {
                    errorHandler(this, new ErrorEventArgs(ex));
                }
                finally
                {
                    if (!e.MoveNext())
                    {
                        e.Reset();
                        e.MoveNext();
                    }
                }
            }
        }
    }
}
